#ifndef ARVORESINTATICA_H_
#define ARVORESINTATICA_H_

#include <list>
#include <queue>

#include "definicoes.h"

#include "lexico.h"
#include "Tokem.h"
#include "Nodo.h"

class ArvoreSintatica
{
public:
	ArvoreSintatica(std::queue<Tokem> *saidaLexico);
	
	virtual ~ArvoreSintatica();
	
private:
	
	// imprime a arvore gerada pela analise lexica
	void imprime();
	void percorre(Nodo *raiz);
	
	// destroi a arvore criada em execucao
	ERROS destroiArvore(Nodo *raiz);
	
	// metodos referentes aos nao terminais
	ERROS programa(Nodo *raiz);
	ERROS bloco(Nodo *raiz);
	// tipo desnecessario implementar
	//ERROS tipo(Nodo *raiz);
	ERROS parametros_formais(Nodo *raiz);
	ERROS comando(Nodo *raiz);
	ERROS expressao(Nodo *raiz);
	ERROS expressao_simples(Nodo *raiz);
	ERROS termo(Nodo *raiz);
	ERROS fator(Nodo *raiz);
	
	void naoTerminal(Nodo *raiz);
	void terminal(Nodo *raiz);
	
	
	Nodo *raiz;
	
	// fila de tokens
	std::queue<Tokem> *fila;
	
	// para caso algum erro ocorra, o erro devera ser reportado
	ERROS erro;
	
	// contador de recursao para impressao
	int count;
	bool volta;

	
};

#endif /*ARVORESINTATICA_H_*/
